#include "util.h"

Util::Util()
{

}

bool Util::isLastCharAnOperator(QString str)
{
    int last = str.length() - 1;
    return str.at(last) == '+' || str.at(last) == '-'
            || str.at(last) == '*' || str.at(last) == '/';
}

bool Util::isNum(char c)
{
    return c >= '0' && c <= '9';
}

bool Util::isOperator(char c)
{
    return c == '+' || c == '-' || c == '*' || c == '/' || c == '%';
}

bool Util::isLegalCharacter(char c)
{
    return isNum(c) || isOperator(c) || c == '.';
}

int Util::strToInt(QString str)
{
    int temp = 0;
    int flag = 1;
    for(QChar c : str){
        if(c == '-'){
            flag = -1;
            continue;
        }
        temp *= 10;//每进一位乘十
        temp += (c.toLatin1() - '0');//减去‘0’可以得到对应的数值
    }
    return temp * flag;
}

double Util::strToDouble(QString str)
{
    double temp = 0.0;
    double pi = 0.1;
    double flag = 1.0;
    int start = 0;
    //考虑负数的情况
    if (str.at(0) == '-')
    {
        flag = -1.0;
        start = 1;
    }
    int i = start;
    //计算整数部分
    for(; i < str.length(); i++){
        //遇到小数点跳出整数位的计算
        if (str.at(i) == '.')
            break;
        temp *= 10.0;
        //与‘0’的ASCLL的差值为到对应的数值
//        qDebug()<<str.at(i).toLatin1()<<"--"<<endl;
        temp += (str.at(i).toLatin1() - '0');
    }
    //如果只有整数数位，直接返回整数部分
    if (i == str.length())
        return temp * flag;
    i++;
    //计算小数部分
    for(; i < str.length(); i++){
//        qDebug()<<str.at(i).toLatin1()<<"--"<<endl;
        temp += (str.at(i).toLatin1() - '0') * pi;
        pi *= 0.1;
    }
    return temp * flag;
}

bool Util::isIntNumStr(QString str)
{
    //第一位非数字时，只允许负号
    if (!isNum(str[0].toLatin1()) && str[0] != '-') {
        return false;
    }
    for (int i = 1; i < str.length(); i++) {
        if (!isNum(str[i].toLatin1()))//非数字字符
            return false;
    }
    return true;
}

bool Util::isNumStr(QString str)
{
    int pointCount = 0;
    //第一个字符只能是 负号 或 数字
    if (!isNum(str[0].toLatin1()) && str[0] != '-') return false;

    //最后一个字符只能是数字
    if (!isNum(str[str.length() - 1].toLatin1())) return false;

    //如果负号开头且长度大于等于2，第二个字符只能是数字
    if (str[0] == '-' && str.length() >= 2 && !isNum(str[1].toLatin1()))	return false;

    //后面的是数字或小数点，且最多只能有一个小数点
    for (int i = 1; i < str.length(); i++) {
        if (!isNum(str[i].toLatin1())) {
            if (str[i] == '.') {
                if (pointCount > 0) {	//只能有一个小数点
                    return false;
                }
                pointCount++;
            }
            else {
                return false;
            }
        }
    }
    return true;
}

bool Util::checkExpression(QString str)
{
    //只能是数字、操作符或点号
    for (int i = 0; i < str.length(); i++) {
        if (!isLegalCharacter(str[i].toLatin1())) {
            return false;
        }
    }
    return true;
}

QString Util::dealDoubleStr(QString str)
{
    int right = str.length() - 1;
    while(right > 0 && str[right] == '0') right--;
    if(right > 0 && str[right] == '.') right--;
    return str.mid(0, right + 1);
}







